package net.xdclass.service;

import net.xdclass.controller.req.*;
import net.xdclass.dto.AccountFileDTO;
import net.xdclass.dto.FileChunkDTO;
import net.xdclass.dto.FolderTreeNodeDTO;
import net.xdclass.model.AccountFileDO;

import java.util.List;

/**
 * @author 姜阿木
 * @date 2025/6/19 19:47
 */
public interface AccountFileService {

    /**
     * 获取用户文件列表
     *
     * @param accountId 用户ID
     * @param parentId 父级文件夹ID
     * @return 文件列表
     */
    List<AccountFileDTO> list(Long accountId, Long parentId);

    /**
     * 创建文件夹
     *
     * @param req 文件夹创建请求
     * @return 文件夹ID
     */
    Long createFolder(FolderCreateReq req);

    /**
     * 重命名文件
     * @param req
     */
    void renameFile(FileUpdateReq req);

    /**
     * 获取文件树
     */
    List<FolderTreeNodeDTO> folderTree(Long accountId);

    List<FolderTreeNodeDTO> folderTreeV2(Long accountId);

    /**
     * 小文件上传
     * @param req
     */
    void fileUpload(FileUploadReq req);

    /**
     * 批量移动文件夹
     * @param req
     */
    void moveBatch(FileBatchReq req);

    /**
     * 批量删除文件
     * @param req
     */
    void delBatch(FileDelReq req);

    /**
     * 批量复制文件
     * @param req
     */
    void copyBatch(FileBatchReq req);

    /**
     * 秒传接口
     * @param req
     * @return
     */
    boolean secondUpload(FileSecondUploadReq req);


    /**
     * 保存文件和文件关联关系
     * @param req
     * @param storeFileObjectKey
     */
    void saveFileAndAccountFile(FileUploadReq req, String storeFileObjectKey);

    /**
     * 检查文件ID是否合法
     * @param fileIds
     * @param accountId
     * @return
     */
    List<AccountFileDO> checkFileIDLegal(List<Long> fileIds, Long accountId);

    /**
     * 递归查询所有文件
     * @param allAccountFileDOS
     * @param prepareAccountFileDOS
     * @param onlyFolder
     */
    void findAllAccountFileDOWithRecur(List<AccountFileDO> allAccountFileDOS, List<AccountFileDO> prepareAccountFileDOS, boolean onlyFolder);

    /**
     * 递归查询所有文件
     * @param accountFileDOList
     * @param targetFolderId
     * @return
     */
    List<AccountFileDO> findBatchCopyWithRecur(List<AccountFileDO> accountFileDOList, Long targetFolderId);

    /**
     * 检查容量是否充足
     *
     */
    boolean checkAndUpdateCapacity(Long accountId, Long fileSize);

    /**
     * 处理文件名重复
     * @param accountFileDO
     */
    Long processFileNameDuplicate(AccountFileDO accountFileDO);
}
